// 给定两个以字符串形式表示的非负整数 num1 和 num2，
// 返回 num1 和 num2 的乘积，它们的乘积也表示为字符串形式。
// 其中：
// num1 和 num2 的长度小于110。
// num1 和 num2 只包含数字 0-9。
// num1 和 num2 均不以零开头，除非是数字 0 本身。
// 不能使用任何标准库的大数类型（比如 BigInteger）或直接将输入转换为整数来处理。

// 暴露接口
function multiply(num1: string, num2: string): string {
  if (num2 === "0" || num1 === "0") {// 边界案例
    return "0";
  }
  let len1: number = num1.length;
  let len2: number = num2.length;
  let res: string = "";// 最终结果
  for (let i = len2 - 1; i >= 0; i--) {// 注意两个for循环的下标
    let currRes: string = "";// 当前计算结果
    let carry: number = 0;// 当前进位
    for (let j = len1 - 1; j >= 0; j--) {
      let currSum: number = parseInt(num1[j]) * parseInt(num2[i]) + carry;// 算上进位的总和
      let realNum: number = currSum % 10;// 真实数位
      carry = Math.floor(currSum / 10);// 计算当前进位
      currRes = realNum + currRes;// 用新得到的数位去拼接完成结果
    }
    for (let k = len2 - 1; k > i; k--) {// 竖式运算的后位补0
      currRes += "0";
    }
    currRes = carry > 0 ? carry + currRes : currRes;// 计算是否有进位剩余
    res = addStrings(res, currRes);
  }
  return res;
}

// 辅助方法，加法实现
function addStrings(num1: string, num2: string): string {
  let pointer1: number = num1.length - 1; // 指针1
  let pointer2: number = num2.length - 1; // 指针2
  let currNum1: number = 0; // 当前数1
  let currNum2: number = 0; // 当前数2
  let carry: number = 0; // 初始进位
  let res: string = ""; // 结果变量
  while (pointer1 >= 0 || pointer2 >= 0) {
    // 判断指针是否出现越界
    currNum1 = pointer1 < 0 ? 0 : parseInt(num1[pointer1]);
    currNum2 = pointer2 < 0 ? 0 : parseInt(num2[pointer2]);
    let currSum: number = currNum1 + currNum2 + carry; // 当前进位和
    let realNum: number = currSum % 10; // 真实位数
    carry = Math.floor(currSum / 10); /*计算进位*/
    res = realNum + res;
    pointer1--;
    pointer2--;
  }
  return carry > 0 ? "1" + res : res;
}

// 这道题目也是基于竖式运算乘法的原理来进行求解
// 此外，还需要书写出竖式运算加法的解法才能求解
// 实现的过程中要注意的细节比较繁琐，例如：
// 1、对两个数进行 for 循环过程的循环计时器如何设置？
// 2、两数之间任意一个出现“0”又该怎么处理？
// 3、乘法的进位要怎么计算？得到进位后要在哪个位置补上进位？会遗漏吗？
// 4、每轮计算的结果要怎么拼接？
// 5、在给定两数的数位较多的情况下，怎么给每轮计算的结果去补“0”？
// 6、得到每轮计算结果后的竖式运算加法又要怎么书写？
// 如果上述答案都能解答，那应该就能求解出这道问题的结果了。